package com.zxwl.base.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface IBaseDao<T> 
{
	public T createEntity() throws InstantiationException, IllegalAccessException;
	/**
	 * 查询所有记录
	 * @return
	 */
	public List<T> queryAll();  
	/**
	 * 根据ID加载唯一记录
	 * @param entityId
	 * @return
	 */
	public T queryById(Serializable entityId);
	/**
	 * 将新建实体对象保存到数据库中
	 * @param entity
	 */
	public void save(T entity);   
	/**
	 * 根据ID删除一个或者多个实体
	 * @param entityIds
	 */
	public void delete(Serializable ... entityIds);   //删除实体
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public void update(T entity);  //更新实体

	/**
	 * 根据ID删除实体对象
	 * @param entityId
	 */
	public void delete(Serializable entityId);// 删除单个实体
		
	/**
	 * 根据条件查询唯一对象
	 * @param hql
	 * @param queryParams
	 * @return
	 */
    public T query(QueryParameter queryParamter);//使用hql语句操作
    //T query(String hql, QueryParameter queryParameter);
    /**
     * 查询符合条件的实体列表
     * @param hql
     * @param queryParameter
     * @return
     */
    public List<T> queryList(QueryParameter queryParameter);
    //List<T> queryList(String hql,QueryParameter queryParameter);
    
	/**
	 * 根据条件查询总行数
	 * @return
	 */
	public long queryRowCount(QueryParameter queryParams);
	/**
	 * 执行存储过程返回游标和输出参数
	 * @param procedureName
	 * @param procParams
	 * @param outParams
	 * @return
	 */
	public List<T> queryListByProcedure(String procedureName,QueryParameter queryParameter);
	
	/**
	 * 
	 * @param procedureName
	 * @param queryParameter
	 * @return
	 */
	public List<Map<String,String>> queryMapListByProcedure(String procedureName,QueryParameter queryParameter);
	/**
	 * 执行存储过程返回输出参数
	 * @param procedureName
	 * @param procParams
	 * @param outParams
	 */
	public void executeProcedure(final String procedureName,  QueryParameter queryParameter);
	/**
	 * 
	 * @param procedureName
	 * @param queryParameter
	 * @param dataPage
	 */
	public void queryMapListForPageByProcedure(final String procedureName,DataPage<Map<String,String>> dataPage);
	
	/**
	 * 
	 * @param procedureName
	 * @param dataPage
	 */
	public void queryForPageByProcedure(final String procedureName,DataPage<T> dataPage);
	
	/**
	 * 根据dataPage参数查询分页数据
	 * @param dataPage
	 */
	public List<T> queryForPage(DataPage<T> dataPage);
	/**
	 * 保存多个
	 * @param entity
	 */
	public void save(List<T> entity);

	/**
	 * 执行sql语句更新记录
	 * @param hql
	 * @return
	 */
	Integer executeUpdate(String hql);
	/**
	 * 判断是否已经改变
	 */
	public Boolean isChanged(T entity);
	/**
	 * 更新时间戳
	 */
	public void updateTimestamp(T entity);
	
}
